#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import json
import os
from pathlib import Path

class ConfigManager:
    """配置管理器，负责应用程序配置的读取和保存"""
    
    DEFAULT_CONFIG = {
        # 番茄钟模式配置
        "pomodoro": {
            "work_minutes": 25,      # 工作时长（分钟）
            "break_minutes": 5,      # 休息时长（分钟）
            "long_break_minutes": 15,  # 长休息时长（分钟）
            "long_break_after": 4    # 几个番茄钟后进行长休息
        },
        # Flowdoro模式配置
        "flowdoro": {
            "break_ratio": 0.2,      # 休息时间与工作时间的比例
            "min_break_minutes": 3,  # 最短休息时间（分钟）
            "max_break_minutes": 15  # 最长休息时间（分钟）
        },
        # 通用设置
        "general": {
            "default_mode": "pomodoro",  # 默认模式：pomodoro 或 flowdoro
            "sound_enabled": True,       # 是否启用声音提醒
            "auto_start_break": True,    # 是否自动开始休息
            "auto_start_work": True,     # 是否自动开始工作
            "start_with_system": False,  # 是否随系统启动
            "minimize_to_tray": True     # 是否最小化到托盘
        },
        # UI设置
        "ui": {
            "theme": "light",            # 主题：light 或 dark
            "language": "zh_CN"          # 语言
        }
    }
    
    def __init__(self, config_file=None):
        """初始化配置管理器
        
        Args:
            config_file: 配置文件路径，如果为None则使用默认路径
        """
        if config_file is None:
            # 使用用户目录下的配置文件
            self.config_dir = Path.home() / ".bunny-break"
            self.config_file = self.config_dir / "config.json"
        else:
            self.config_file = Path(config_file)
            self.config_dir = self.config_file.parent
        
        # 确保配置目录存在
        self.config_dir.mkdir(parents=True, exist_ok=True)
        
        # 加载配置
        self.config = self._load_config()
    
    def _load_config(self):
        """从文件加载配置，如果文件不存在则使用默认配置"""
        if self.config_file.exists():
            try:
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    config = json.load(f)
                # 合并默认配置，确保所有必要的配置项都存在
                return self._merge_configs(self.DEFAULT_CONFIG, config)
            except Exception as e:
                print(f"加载配置文件失败: {e}")
                return self.DEFAULT_CONFIG.copy()
        else:
            # 文件不存在，使用默认配置并保存
            config = self.DEFAULT_CONFIG.copy()
            self.save_config(config)
            return config
    
    def _merge_configs(self, default, user):
        """合并默认配置和用户配置，确保所有必要的配置项都存在"""
        result = default.copy()
        for key, value in user.items():
            if key in result and isinstance(result[key], dict) and isinstance(value, dict):
                result[key] = self._merge_configs(result[key], value)
            else:
                result[key] = value
        return result
    
    def save_config(self, config=None):
        """保存配置到文件
        
        Args:
            config: 要保存的配置，如果为None则保存当前配置
        """
        if config is None:
            config = self.config
        
        try:
            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(config, f, indent=4, ensure_ascii=False)
        except Exception as e:
            print(f"保存配置文件失败: {e}")
    
    def get(self, section, key=None):
        """获取配置项
        
        Args:
            section: 配置节名称
            key: 配置项名称，如果为None则返回整个节
            
        Returns:
            配置项的值
        """
        if key is None:
            return self.config.get(section, {})
        return self.config.get(section, {}).get(key)
    
    def set(self, section, key, value):
        """设置配置项
        
        Args:
            section: 配置节名称
            key: 配置项名称
            value: 配置项的值
        """
        if section not in self.config:
            self.config[section] = {}
        self.config[section][key] = value
        self.save_config()
    
    def get_work_minutes(self):
        """获取当前模式的工作时长（分钟）"""
        mode = self.get("general", "default_mode")
        if mode == "pomodoro":
            return self.get("pomodoro", "work_minutes")
        return 0  # Flowdoro模式下没有预设的工作时长
    
    def get_break_minutes(self):
        """获取当前模式的休息时长（分钟）"""
        mode = self.get("general", "default_mode")
        if mode == "pomodoro":
            return self.get("pomodoro", "break_minutes")
        return 0  # Flowdoro模式下休息时长需要根据工作时长计算 